<?php

namespace app\admin\jwt;

use \Firebase\JWT\JWT;
class Jwts
{

    private static $config = [
        'key'=>'thisisakey',
        'iss' => 'http://free.cn', //签发者 可选
        'aud' => 'http://free.cn', //接收该JWT的一方，可选
        'exp' => 7200,   //过期时间,这里设置2个小时
        'name' => 'admin',
    ];

    /**
     * @param $user_id
     * @return string
     */
    public static function getToken($user_id){
        $time = time(); //当前时间
        $token = [
            'iss' => self::$config['iss'], //签发者 可选
            'aud' => self::$config['aud'], //接收该JWT的一方，可选
            'iat' => $time, //签发时间
            'nbf' => $time-1 , //(Not Before)：某个时间点后才能访问，比如设置time+30，表示当前时间30秒后才能使用
            'exp' => $time+self::$config['exp'], //过期时间,这里设置2个小时
            'data' => [
                //自定义信息，不要定义敏感信息
                'userid' =>$user_id,
            ]
        ];
        $token = JWT::encode($token, self::$config['key']);
        //存储token到redis
        if(redis()->exists(self::$config['name'].':'.$user_id)){
            redis()->delete(self::$config['name'].':'.$user_id);
        }
        redis()->set(self::$config['name'].':'.$user_id,$token,self::$config['exp']);
        return $token; //输出Token  默认'HS256'
    }

    /**
     * @param $token
     */
    public static function verifyToken($token){
        JWT::$leeway = 60;//当前时间减去60，把时间留点余地
        $decoded = JWT::decode($token, self::$config['key'], ['HS256']); //HS256方式，这里要和签发的时候对应
        $old = redis()->get(self::$config['name'].':'.$decoded->data->userid);
        if($old != $token){
            throw new \Firebase\JWT\ExpiredException('已在其他地方登录，请重新登录！');
        }
        return (array)$decoded;

    }
}